package 剑指Offer;

public class Offer16_数值的整数次方 {
    public static void main(String[] args) {
        System.out.println(new Offer16_数值的整数次方().myPow(2.00000, 10));
    }

    public double myPow(double x, int n) {
        if (x == 0) {
            return 0;
        }
// 变量 n∈[−2147483648,2147483647] ，因此当 n = -2147483648n=−2147483648 时执行 n = -n会因越界而赋值出错。解决方法是先将 n 存入 long 变量 b ，后面用 b 操作即可。
        long b = n;
        double res = 1.0;

        if (b < 0) {
            x = 1 / x;
            b = -b;
        }
        while (b > 0) {
            //二进制最右边数的是1
            if ((b & 1) == 1) {
                res = res * x;
            }
            x *= x;//基底翻倍
            b = b >> 1;//右移b1位，其实就是删除最后那个二进制数
        }
        return res;
    }
}
